Music of the O.C. top of page

Author: Jessica Marx

Date: 02 August 2019

# load packages, install if needed
packages = c(
      "dplyr"
    , "ggplot2"
    , "formattable"
    , "plotly"
    , "RColorBrewer"
    , "scales"
    , "stringr"
    , "tidyr"
    , "ElmeR"
    , "RJDBC"
    , "kableExtra"
    , "wesanderson"
    , "reshape2"
    , "rtweet"
    , "tidytext"
    , "lubridate"
    , "wordcloud"
    , "ggpubr"
    , "ggthemes"
    , "knitrBootstrap"
    , "DT"
    , "MatchIt"
    , "beyonce"
    , "UpSetR"
    , "gganimate"
    , "wordcloud2"
    , "widyr"
    , "ggraph"
    , "igraph"
    , "aod"
    , "corrplot"
    , "ROCR"
    , "InformationValue"
    , "car"
    , "glmnet"
    , "caret"
    , "kernlab"
    , "pdp"
    , "rpart.plot"
    , "rpart"
    , "e1071"
    )

package.check <- lapply(packages, FUN = function(x) {
  if (!require(x, character.only = TRUE)) {
    install.packages(x, dependencies = TRUE)
    library(x, character.only = TRUE)
  }
})


options(scipen= 999)
theme_set(theme_minimal(base_size = 9, base_family = "Roboto"))

#functions!

#round 
round.to <- function(x, b) {
  round(x/b)*b
}

#odds to probability
odds.to.prob <- function(odds) {
  odds/(1 + odds) 
}

#log odds to probability 
logit2prob <- function(logit){
  odds <- exp(logit)
  prob <- odds / (1 + odds)
  return(prob)
}

#convert to a range
range01 <- function(x){
  (x-min(x))/(max(x)-min(x))
}

#function to get vector of color values from RColorBrewer
get_hex_values <- function(pal) {
    brewer.pal(brewer.pal.info[pal, "maxcolors"], pal)
}
paired_cols <- get_hex_values(pal = "Paired")

Most Frequently Played Artists

By Season

Block Party, Death Cab, Youth Group, Zero 7, Sufjan Stevens, and M. Craft are the only artists to span 3 seasons.

Artist Country of Origin

Genres

LS0tCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IGZhbHNlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogNQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgCi0tLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keSB7CiAgZm9udC1zaXplOiAxMnB0OwogIGZvbnQtZmFtaWx5OiAiUm9ib3RvIiwgc2Fucy1zZXJpZjsKfQoKdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2E2Y2VlMzsKICAgIGNvbG9yOiBibGFjazsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIGZvbnQtZmFtaWx5OiAiUm9ib3RvIiwgc2Fucy1zZXJpZjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICA8IS0tIG1hcmdpbi1sZWZ0OiBhdXRvOyAtLT4KICAgIDwhLS0gbWFyZ2luLXJpZ2h0OiBhdXRvOyAtLT4KICAgIDwhLS0gcGFkZGluZy10b3A6IDI1cHg7IC0tPgogIH0KCnRkIHsgIC8qIFRhYmxlICAqLwogIGZvbnQtc2l6ZTogMTBwdDsKICA8IS0tIHRleHQtYWxpZ246IGNlbnRlcjsgLS0+CiAgZm9udC1mYW1pbHk6ICJSb2JvdG8iLCBzYW5zLXNlcmlmOwogIDwhLS0gcGFkZGluZy10b3A6IDI1cHg7IC0tPgp9CgpoMSB7CiAgZm9udC1zaXplOiAxNnB0OwogIGZvbnQtZmFtaWx5OiAiT3N3YWxkIiwgc2Fucy1zZXJpZjsKfQogIApoMiB7CiAgZm9udC1zaXplOiAxNHB0OwogIGZvbnQtZmFtaWx5OiAiT3N3YWxkIiwgc2Fucy1zZXJpZjsKICA8IS0tIGNvbG9yOiAjMWY3OGI0OyAtLT4KICBmb250LWZhbWlseTogIk9zd2FsZCIsIHNhbnMtc2VyaWY7Cn0KCmgzIHsKICBmb250LXNpemU6IDE0cHQ7CiAgZm9udC1mYW1pbHk6ICJPc3dhbGQiLCBzYW5zLXNlcmlmOwogIH0KICAKaDQgewogIGZvbnQtc2l6ZTogMTJwdDsKICBmb250LWZhbWlseTogIk9zd2FsZCIsIHNhbnMtc2VyaWY7Cn0KaDUgewogIGZvbnQtc2l6ZTogMTJwdDsKICBmb250LWZhbWlseTogIk9zd2FsZCIsIHNhbnMtc2VyaWY7Cn0KYSB7CiAgY29sb3I6ICMxZjc4YjQ7CiAgZm9udC1zaXplOiAxMnB0OwogIGZvbnQtZmFtaWx5OiAiT3N3YWxkIiwgc2Fucy1zZXJpZjsKfQoKCi5zaWRlbmF2IHsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDIwMHB4OwogIHBvc2l0aW9uOiBmaXhlZDsKICB6LWluZGV4OiAxOwogIHRvcDogMDsKICBsZWZ0OiAwOwogIGJhY2tncm91bmQtY29sb3I6ICNhNmNlZTM7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIHBhZGRpbmctdG9wOiAyMHB4Owp9Cgouc2lkZW5hdiBhIHsKICBwYWRkaW5nOiA2cHggOHB4IDZweCAxNnB4OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICBmb250LXNpemU6IDE4cHQ7CiAgPCEtLSBmb250LXdlaWdodDogYm9sZGVyOyAtLT4KICBmb250LWZhbWlseTogIk9zd2FsZCIsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICNGRkZGRkY7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouY2VudGVyIHsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW4tbGVmdDogYXV0bzsKICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgd2lkdGg6IDEwMCU7Cn0KCi5zaWRlbmF2IGE6aG92ZXIgewogIGNvbG9yOiAjZjFmMWYxOwp9CgoubWFpbiB7CiAgbWFyZ2luLWxlZnQ6IDIwMHB4OyAvKiBTYW1lIGFzIHRoZSB3aWR0aCBvZiB0aGUgc2lkZW5hdiAqLwoKfQoubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTQwMHB4OwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogYXV0bzsKICBwYWRkaW5nOiAyNXB4Cn0KICAvKnBhZGRpbmc6IDBweCA1cHg7ICovCn0KCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtaGVpZ2h0OiA0NTBweCkgewogIC5zaWRlbmF2IHtwYWRkaW5nLXRvcDogMTVweDt9CiAgLnNpZGVuYXYgYSB7Zm9udC1zaXplOiAxOHB4O30KfQo8L3N0eWxlPgoKPCEtLSBUSVRMRSBJTkZPICAtLT4KCjxkaXYgY2xhc3M9InNpZGVuYXYiPgogIDxhIGhyZWY9IiNhYm91dCI+TXVzaWMgb2YgdGhlIE8uQy48L2E+CiAgPGltZyBzcmM9Ii9Vc2Vycy9jODl2L0RvY3VtZW50cy9GdW4vb2MuanBnIiBhbHQ9IiIgd2lkdGg9MTgwcHggY2xhc3M9ImNlbnRlciIvPgogIDxhIGhyZWY9IiN0b3AiPiA8Zm9udCBmYWNlPSJSb2JvdG8iIHNpemU9IjIiIGNvbG9yPSAiIzFmNzhiNCI+IHRvcCBvZiBwYWdlIDwvZm9udD48L2E+CjwvZGl2PgoKPCEtLSBDT05URU5UIFNUQVJUUyBIRVJFICAtLT4KCjxkaXYgY2xhc3M9Im1haW4iPgo8ZGl2IGNsYXNzPSJib2R5Ij4KCiMjQXV0aG9yOiBfXzxmb250IGNvbG9yPSIjMWY3OGI0Ij5KZXNzaWNhIE1hcng8L2ZvbnQ+X18KCiMjRGF0ZTogX188Zm9udCBjb2xvcj0iIzFmNzhiNCI7IGZvbnQgc2l6ZT0iMyI+YHIgZm9ybWF0KFN5cy50aW1lKCksICIlZCAlQiAlWSIpYDwvZm9udD5fXwoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9Cgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQoKYGBgCgpgYGB7ciBwYWNrYWdlLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBsb2FkIHBhY2thZ2VzLCBpbnN0YWxsIGlmIG5lZWRlZApwYWNrYWdlcyA9IGMoCiAgICAgICJkcGx5ciIKICAgICwgImdncGxvdDIiCiAgICAsICJmb3JtYXR0YWJsZSIKICAgICwgInBsb3RseSIKICAgICwgIlJDb2xvckJyZXdlciIKICAgICwgInNjYWxlcyIKICAgICwgInN0cmluZ3IiCiAgICAsICJ0aWR5ciIKICAgICwgIkVsbWVSIgogICAgLCAiUkpEQkMiCiAgICAsICJrYWJsZUV4dHJhIgogICAgLCAid2VzYW5kZXJzb24iCiAgICAsICJyZXNoYXBlMiIKICAgICwgInJ0d2VldCIKICAgICwgInRpZHl0ZXh0IgogICAgLCAibHVicmlkYXRlIgogICAgLCAid29yZGNsb3VkIgogICAgLCAiZ2dwdWJyIgogICAgLCAiZ2d0aGVtZXMiCiAgICAsICJrbml0ckJvb3RzdHJhcCIKICAgICwgIkRUIgogICAgLCAiTWF0Y2hJdCIKICAgICwgImJleW9uY2UiCiAgICAsICJVcFNldFIiCiAgICAsICJnZ2FuaW1hdGUiCiAgICAsICJ3b3JkY2xvdWQyIgogICAgLCAid2lkeXIiCiAgICAsICJnZ3JhcGgiCiAgICAsICJpZ3JhcGgiCiAgICAsICJhb2QiCiAgICAsICJjb3JycGxvdCIKICAgICwgIlJPQ1IiCiAgICAsICJJbmZvcm1hdGlvblZhbHVlIgogICAgLCAiY2FyIgogICAgLCAiZ2xtbmV0IgogICAgLCAiY2FyZXQiCiAgICAsICJrZXJubGFiIgogICAgLCAicGRwIgogICAgLCAicnBhcnQucGxvdCIKICAgICwgInJwYXJ0IgogICAgLCAiZTEwNzEiCiAgICApCgpwYWNrYWdlLmNoZWNrIDwtIGxhcHBseShwYWNrYWdlcywgRlVOID0gZnVuY3Rpb24oeCkgewogIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7CiAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKICB9Cn0pCgoKb3B0aW9ucyhzY2lwZW49IDk5OSkKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gOSwgYmFzZV9mYW1pbHkgPSAiUm9ib3RvIikpCmBgYAoKYGBge3IgZnVuY3Rpb25zfQoKI2Z1bmN0aW9ucyEKCiNyb3VuZCAKcm91bmQudG8gPC0gZnVuY3Rpb24oeCwgYikgewogIHJvdW5kKHgvYikqYgp9Cgojb2RkcyB0byBwcm9iYWJpbGl0eQpvZGRzLnRvLnByb2IgPC0gZnVuY3Rpb24ob2RkcykgewogIG9kZHMvKDEgKyBvZGRzKSAKfQoKI2xvZyBvZGRzIHRvIHByb2JhYmlsaXR5IApsb2dpdDJwcm9iIDwtIGZ1bmN0aW9uKGxvZ2l0KXsKICBvZGRzIDwtIGV4cChsb2dpdCkKICBwcm9iIDwtIG9kZHMgLyAoMSArIG9kZHMpCiAgcmV0dXJuKHByb2IpCn0KCiNjb252ZXJ0IHRvIGEgcmFuZ2UKcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsKICAoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKQp9CgojZnVuY3Rpb24gdG8gZ2V0IHZlY3RvciBvZiBjb2xvciB2YWx1ZXMgZnJvbSBSQ29sb3JCcmV3ZXIKZ2V0X2hleF92YWx1ZXMgPC0gZnVuY3Rpb24ocGFsKSB7CglicmV3ZXIucGFsKGJyZXdlci5wYWwuaW5mb1twYWwsICJtYXhjb2xvcnMiXSwgcGFsKQp9CnBhaXJlZF9jb2xzIDwtIGdldF9oZXhfdmFsdWVzKHBhbCA9ICJQYWlyZWQiKQoKCmBgYAoKIyNNb3N0IEZyZXF1ZW50bHkgUGxheWVkIEFydGlzdHMgCgpgYGB7cn0KCm9jX3NvbmdzICU+JSAKICBkcm9wX25hKCkgJT4lIAogIGZpbHRlcihBcnRpc3QgJWluJSB0b3AkQXJ0aXN0KSAlPiUgCiAgZ3JvdXBfYnkoQXJ0aXN0KSAlPiUgCiAgY291bnQoKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgaGVhZCgzMCkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKEFydGlzdCA9IHJlb3JkZXIoQXJ0aXN0LCAtbikpICU+JSAKICBwbG90X2x5KAogICAgeCA9IH5BcnRpc3QsCiAgICB5ID0gfm4sCiAgICB0eXBlID0gImJhciIsCiAgICBjb2xvciA9IH5BcnRpc3QsCiAgICAjIGNvbG9ycyA9ICJQYWlyZWQiLAogICAgaGVpZ2h0ID0gNTUwLAogICAgd2lkdGggPSA5MDAsCiAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICB0ZXh0ID0gfnBhc3RlKAogICAgIkFydGlzdDoiLCBBcnRpc3QsCiAgICAiPGJyPlNvbmdzIFBsYXllZDoiLCBjb21tYShuKQogICAgKQogICkgJT4lIAogIGxheW91dCgKICAgIHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICN0aXRsZSA9ICJUb3AgMzAgTW9zdCBGcmVxdWVudGx5IFBsYXllZCBBcnRpc3RzIiwKICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCIpLCAKICAgIG1hcmdpbiA9IGxpc3QociA9IDEwMCksCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU29uZ3MgUGxheWVkIiksIAogICAgYmFybW9kZSA9ICdkb2RnZScsCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQXJ0aXN0IiwKICAgICAgICAgICAgICAgICAgICAgdGlja2FuZ2xlID0gMzApCgopCgpgYGAKCiMjQnkgU2Vhc29uIHsudGFic2V0fQoKQmxvY2sgUGFydHksIERlYXRoIENhYiwgWW91dGggR3JvdXAsIFplcm8gNywgU3VmamFuIFN0ZXZlbnMsIGFuZCBNLiBDcmFmdCBhcmUgdGhlIG9ubHkgYXJ0aXN0cyB0byBzcGFuIDMgc2Vhc29ucy4gCgpgYGB7cn0KCm9jX3NvbmdzICU+JSAKICBkcm9wX25hKCkgJT4lIAogIGZpbHRlcihBcnRpc3QgJWluJSB0b3AkQXJ0aXN0KSAlPiUgCiAgZ3JvdXBfYnkoU2Vhc29uLCBBcnRpc3QpICU+JSAKICBjb3VudCgpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KEFydGlzdCkgJT4lCiAgbXV0YXRlKG9yZGVyX24gPSBzdW0obikpICU+JQogIGFycmFuZ2UoZGVzYyhvcmRlcl9uKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKFNlYXNvbiA9IGFzLmZhY3RvcihgU2Vhc29uYCksCiAgICAgICAgIEFydGlzdCA9IHJlb3JkZXIoQXJ0aXN0LCAtb3JkZXJfbikpICU+JSAKICAjbXV0YXRlKEFydGlzdCA9IHJlb3JkZXIoQXJ0aXN0LCAtbikpICU+JSAKICBwbG90X2x5KAogICAgeCA9IH5BcnRpc3QsCiAgICB5ID0gfm4sCiAgICB0eXBlID0gImJhciIsCiAgICBoZWlnaHQgPSA1NTAsCiAgICB3aWR0aCA9IDkwMCwKICAgIG5hbWUgPSB+cGFzdGUoIlNlYXNvbiAiLCBTZWFzb24pLAogICAgaG92ZXJpbmZvID0gJ3RleHQnLAogICAgbGVnZW5kID0gflNlYXNvbiwgCiAgICBjb2xvciA9IH5TZWFzb24sCiAgICBjb2xvcnMgPSAiU2V0MiIsIAogICAgdGV4dCA9IH5wYXN0ZSgKICAgICJBcnRpc3Q6IiwgQXJ0aXN0LAogICAgIjxicj5Tb25ncyBQbGF5ZWQ6IiwgY29tbWEobiksCiAgICAiPGJyPlNlYXNvbjoiLCBTZWFzb24KICAgICkKICApICU+JSAKICBsYXlvdXQoCiAgICAjdGl0bGUgPSAiVG9wIDMwIE1vc3QgRnJlcXVlbnRseSBQbGF5ZWQgQXJ0aXN0cyIsCiAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQXJpYWwiKSwgCiAgICBtYXJnaW4gPSBsaXN0KHIgPSAxMDApLAogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNvbmdzIFBsYXllZCIpLCAKICAgIGJhcm1vZGUgPSAnc3RhY2snLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFydGlzdCIsCiAgICAgICAgICAgICAgICAgICAgIHRpY2thbmdsZSA9IDMwKQoKKQoKYGBgCgojI0FydGlzdCBDb3VudHJ5IG9mIE9yaWdpbgoKYGBge3J9CgpvY19hcnRpc3RzID0gYXJ0aXN0cyAlPiUgCiAgZmlsdGVyKGFydGlzdF9tYiAlaW4lIG9jX3NvbmdzJEFydGlzdCkKCm9jX2FydGlzdHMgJT4lIAogIG11dGF0ZShjb3VudHJ5X21iID0gaWZfZWxzZShpcy5uYShjb3VudHJ5X21iKSwgY291bnRyeV9sYXN0Zm0sIGNvdW50cnlfbWIpKSAlPiUgCiAgZ3JvdXBfYnkoY291bnRyeV9tYikgJT4lIAogIHN1bW1hcmlzZShkaXN0aW5jdF9hcnRpc3QgPSBuX2Rpc3RpbmN0KGFydGlzdF9tYikpICU+JSAKICBhcnJhbmdlKGRlc2MoZGlzdGluY3RfYXJ0aXN0KSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoY291bnRyeV9tYiA9IHJlb3JkZXIoY291bnRyeV9tYiwgLWRpc3RpbmN0X2FydGlzdCkpICU+JSAKICAgIHBsb3RfbHkoCiAgICB4ID0gfmNvdW50cnlfbWIsCiAgICB5ID0gfmRpc3RpbmN0X2FydGlzdCwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHdpZHRoID0gOTAwCiAgICAsIGhlaWdodCA9IDU1MCwgCiAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICBjb2xvciA9IH5jb3VudHJ5X21iLAogICAgY29sb3JzID0gIlNldDIiLCAKICAgIHRleHQgPSB+cGFzdGUoCiAgICAiQ291bnRyeToiLCBjb3VudHJ5X21iLAogICAgIjxicj5OdW1iZXIgb2YgQXJ0aXN0czoiLCBjb21tYShkaXN0aW5jdF9hcnRpc3QpKQogICAgKSAlPiUgCiAgbGF5b3V0KAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkFyaWFsIiksIAogICAgbWFyZ2luID0gbGlzdChyID0gMTAwKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJBcnRpc3RzIiksIAogICAgI2Jhcm1vZGUgPSAnc3RhY2snLAogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50cnkiLAogICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGUgPSAzMCkKICAgICkKICAKCmBgYAoKIyNHZW5yZXMKCmBgYHtyfQoKb2NfdGFncyA9IG9jX2FydGlzdHMgJT4lIAogIG11dGF0ZSh0YWdzID0gaWZlbHNlKGlzLm5hKHRhZ3NfbWIpLCB0YWdzX2xhc3RmbSwgdGFnc19tYikKICAgICAgICAgLCBjb3VudHJ5ID0gaWZlbHNlKGlzLm5hKGNvdW50cnlfbWIpLCBjb3VudHJ5X2xhc3RmbSwgY291bnRyeV9tYikKICAgICAgICAgKSAlPiUgCiAgc2VsZWN0KGFydGlzdF9sYXN0Zm0sIGNvdW50cnksIHRhZ3MpICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRhZ3MsIHRva2VuID0gc3RyaW5ncjo6c3RyX3NwbGl0LCBwYXR0ZXJuID0gIjsiKSAlPiUgCiAgdW5pcXVlKCkgJT4lIAogIGdyb3VwX2J5KHdvcmQpICU+JSAKICBjb3VudCgpICU+JSAKICBzdW1tYXJpc2UobiA9IHN1bShuKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIAogIGhlYWQoMzIpCgpvY190YWdzID0gb2NfdGFnc1tjKC04KSwgXQpvY190YWdzID0gb2NfdGFnc1tjKC0xOCksIF0Kb2NfdGFncyR3b3JkID0gdG91cHBlcihvY190YWdzJHdvcmQpCgpvY190YWdzICU+JSAKICBkcm9wX25hKCkgJT4lIAogIG11dGF0ZSh0b3RhbCA9IGxlbmd0aCh1bmlxdWUob2NfYXJ0aXN0cyRhcnRpc3RfbWIpKQogICAgICAgICAsIHBjdCA9IG4vdG90YWwKICAgICAgICAgLCB3b3JkID0gcmVvcmRlcihhcy5mYWN0b3Iod29yZCksIG4pCiAgICAgICAgICkgJT4lIAogIHBsb3RfbHkoCiAgICB4ID0gfm4KICAgICwgeSA9IH53b3JkCiAgICAsIG1vZGUgPSAiYmFyIgogICAgLCBjb2xvciA9IH53b3JkCiAgICAsIGNvbG9ycyA9ICJTcGVjdHJhbCIKICAgICwgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgICAsIHdpZHRoID0gOTAwCiAgICAsIGhlaWdodCA9IDU1MAogICAgLCBob3ZlcmluZm8gPSAidGV4dCIKICAgICwgdGV4dCA9IH5wYXN0ZSgKICAgICAgbiwgIm9yIiwgcGVyY2VudChwY3QpLAogICAgICAib2YgYXJ0aXN0cyBmZWF0dXJlZCBvbiA8YnI+IHRoZSBPLkMuIGZhbGwgdW5kZXIgdGhlIiwgd29yZCwgImdlbnJlLiIKICAgICkKICApICU+JSAKICBsYXlvdXQoCiAgICB4YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkFydGlzdHMiCiAgICApCiAgICAsIHlheGlzID0gbGlzdCgKICAgICAgdGl0bGUgPSAiR2VucmUiCiAgICApCiAgICAsIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJBcmlhbCIpCiAgKQogIAoKYGBgCgo=